
/* file.h: заголовочный файл с функциями чтения и парсинга файлов */

#ifndef FILE_H
#define FILE_H
//==================================================================================================================================================
#include "preproc.h"	// подключение заголовочного файла с типами
#include "tree.h"		// подключение заголовочного файла с деревом
//==================================================================================================================================================

//==================================================================================================================================================
int	read_file(pth_t, string);
//==================================================================================================================================================
int read_file(pth_t path, string arg)
{
	FILE*			 file;										// создание файлового потока
	string			 buff		= NULL;							// буфер потока
	usint			 file_start	= 0,							// флаг начала "рабочей" части файла
					 desc_flag	= 0,
					 file_type	= NOT_INTERPRET_FILE;			// переменная типа файла
	conf_template	 cnftmpl;

	file = fopen(path, "r");									// открытие файла на чтение

	if(file)													// проверка потока (файл успешно открыт)
	{
		while(!feof(file))										// цикл чтения файла (до окончания файла)
		{
			clear_trash();										// очищение корзины

			free(buff);											// освобождение памяти из под буффера

			buff = (string) malloc(sizeof(char) * MAX_LEN);		// выделение памяти под строку

			if(fgets(buff, MAX_LEN, file))						// чтение строки (строка успешно прочитана)
			{
				if(!strncmp(buff, "#HELP START", 11))			// проверка извлеченной строки (строка содержит "#HELP START")
				{
					file_start	= 1;							// пометка о начале "рабочей" части файла конфигурации
					file_type	= HELP_FILE;
					continue;									// перейти к чтению следующей строки
				}
				else if(!strncmp(buff, "#CONF START", 11))
				{
					file_start	= 1;							// пометка о начале "рабочей" части файла конфигурации
					file_type	= CONF_FILE;
					continue;									// перейти к чтению следующей строки
				}
				else if(!strncmp(buff, "#DESC START", 11))
				{
					file_start	= 1;							// пометка о начале "рабочей" части файла конфигурации
					file_type	= DESC_FILE;
					continue;									// перейти к чтению следующей строки
				}

				if(!strncmp(buff, "#END", 4) and file_start)	// проверка извлеченной строки (строки содержит "#HELP END")
				{
					file_start = 0;								// сброс флага начала "рабочей" части файла конфигурации

					free(buff);									// очищение буфера
					clear_trash();								// очищение корзины
					fclose(file);								// закрытие потока

					return SUCCESS;								// сообщаем об успешном прочтении файла
				}

				if(!strncmp(buff, "#TEMPLATE", 9) && (file_type == CONF_FILE))
				{
					string* args = get_args(buff);

					register usint i;

					for(i = 0; i < 5; ++i)
					{
						if(!strncmp(args[i], "USING_NAME", 10))
						{
							cnftmpl.using_name = i;
							continue;
						}

						if(!strncmp(args[i], "FUNC_NAME", 9))
						{
							cnftmpl.func_name = i;
							continue;
						}

						if(!strncmp(args[i], "ARGS_COUNT", 10))
						{
							cnftmpl.args_count = i;
							continue;
						}

						if(!strncmp(args[i], "[DESC]", 6))
						{
							cnftmpl.desc = i;
							continue;
						}

						if(!strncmp(args[i], "DLL_PATH", 8))
						{
							cnftmpl.dll_path = i;
							continue;
						}
					}
				}

				if(file_type != HELP_FILE)
				{
					if(buff[0] == ' ' or buff[0] == '\n')		// проверка первого символа извлеченной строки
						continue;								// перейти к чтению следующей строки
				}

				if(buff[0] == '#' or buff[0] == ';')			// проверка извлеченной строки (строка начинается с # или ; и является комментарием)
					continue;									// перейти к чтению следующей строки

				if(file_start)									// проверка флага начала файла конфигурации (файл начался)
				{
					if(file_type == HELP_FILE)
						printf("%s", buff);						// выводим считанную строку
					else if(file_type == CONF_FILE)
					{
						string	*tmp	= get_args(buff),		// получение аргументов
								 cmd[5]	= {get_cmd(buff),		// получение имени комманды
											tmp[0],
											tmp[1],
											tmp[2],
											tmp[3]};


						/* Добавление узла в дерево */
						root_tree	= add_node(	cmd[cnftmpl.using_name],
												cmd[cnftmpl.func_name],
												str_to_int(cmd[cnftmpl.args_count]),
												cmd[cnftmpl.desc],
												(pth_t) cmd[cnftmpl.dll_path]);
					}
					else if(file_type == DESC_FILE)
					{
						if(strstr(buff, arg))
						{
							printf("\n");
							desc_flag = 1;
							continue;
						}

						if(desc_flag
							and (buff[0] == '[')
							and (buff[2] == ']'
								or buff[3] == ']'
								or buff[4] == ']'))
						{
							printf("\n");
							desc_flag = 0;
							continue;
						}

						if(desc_flag)
						{
							printf("%s", buff);
							continue;
						}
						else
                            continue;
					}
				}
			}
		}

		fclose(file);											// закрытие потока
		return SYNTAX_ERROR;									// возвращаем ошибку
	}

	fclose(file);												// закрытие потока
	return EXIST_ERROR;											// возвращаем ошибку
}
//==================================================================================================================================================

#endif
